// 生成且配置axios实例
import axios from "axios";
import * as storage from "@/utils/storage";
import { Message } from "element-ui";
import router from "@/router";
import {
  setApiCache,
  hasApiCache,
  addCancelConfig,
  getApiCache,
} from "./cache";

const instance = axios.create({
  baseURL: "http://www.zhaochong.top:7000",
  // baseURL: "http://127.0.0.1:7000",
  timeout: 50000,
});

// 设置全局ajax请求拦截器 一般在请求拦截器中设置通用的请求头部
instance.interceptors.request.use(
  (config) => {
    // console.log(config);
    //为每个请求在请求头中加上token
    const token = storage.get("z-admin-token");
    // console.log(token);
    if (token) {
      config.headers["Authorization"] = `jwt ${token}`;
    }

    const { url, params } = config;
    console.log(hasApiCache(url, params));

    const cancel = addCancelConfig(url, config);

    if (hasApiCache(url, params)) {
      cancel(getApiCache(url, params));
    }

    //注意一定要返回 config
    return config;
  },
  (err) => Promise.reject(err)
);

// 全局ajax响应拦截器， 网络响应的结果在我们获取之前 都会经过该拦截器的处理
instance.interceptors.response.use(
  (response) => {
    const {
      status,
      data,
      config: { url, params },
    } = response;
    // console.log(response.config)
    setApiCache(url, data, params);

    if (status === 201) {
      Message.success("创建成功！");
    } else if (status === 204) {
      Message.success("删除成功");
    }

    return data;
  },
  (err) => {
    const { response } = err;

    console.log(err);
    if (axios.isCancel(err)) {
      return Promise.resolve(err.message);
    }

    const info = {
      status: "",
      statusText: "",
    };
    //  网络故障
    if (!response) {
      info.status = 5000;
      info.statusText = "网络故障";

      Message.error(info.statusText);
      return Promise.reject(info);
    }
    const { status, statusText } = response;

    if (status === 401) {
      info.statusText = "认证失败！请确认用户名和密码，重新登录！";
    } else if (status === 403) {
      info.statusText = "没有足够的权限！";
    } else if (status === 404) {
      info.statusText = "请求的资源不存在！";
    } else if (status === 400) {
      info.statusText = "请求参数不合法！";
    } else if (status.toString().startsWith("5")) {
      info.statusText = "服务端异常！";
    } else {
      info.statusText = statusText;
    }

    //401 和 403 都是和用户权限相关的错误状态码 出现该状态码 需要用户进行重新登录
    if (status === 401 || status === 403) {
      //  从router中获取下当前的路由地址，如果不是/login就跳转到/login进行登录
      const {
        history: {
          current: { path },
        },
      } = router;

      if (path !== "/login") {
        //    路由编程式的跳转回登录页面
        router.push({ name: "Login", params: { callback: path } });
      }
    }

    info.status = status;
    Message.error(info.statusText);
    return Promise.reject(info);
  }
);

export default instance;
